IAM ポリシーの記法について理解する

IAM ポリシーの記法について理解する

Clock Icon2024.12.10

こんにちは!よしななです。
今回は、IAM ポリシーの JSON 記法についてなんとなく理解していたところをもう一度理解しなおしたのでまとめました。

目次

  • 基本的な構文
  • 構文詳細
    • Version
    • Statements
      • Sid
      • Effect
      • principal
      • Action
      • Resource
      • Condition
  • まとめ
  • 参考文献

基本的な構文

IAM ポリシーの 基本的な JSON 構文は以下となります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": ""
            },
            "Action": "",
            "Resource": "",
            "Condition": {
                "Bool": {
                    "": ""
                }
            }
        }
    ]
}

通常の JSON と同様に、以下のルールで記述していきます。

  1. JSON は{ }[],:の文字構造と文字列、数字、true / false / nullで構成される
  2. オブジェクトもしくは配列を使用する

また、オブジェクトについては以下のルールに従って記述します。

  • 1個以上の名前と値のペアがあること
  • 名前は文字列で、ダブルクォートで囲み、名前と値の間はコロンで区切ること
  • 前の値と次の値はコンマで区切る
  • 入れ子構造にしたい場合、値を中括弧{}で囲むこと

参考サイト:

RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format

構文詳細

次に IAM ポリシーを構成する要素についてまとめます。

Version

IAM ポリシーの構文ルールのバージョンを示しています。
現時点では2012-10-172008-10-17の2種類のみが定義されています。
2008-10-17は旧バージョンにあたるため、新しいバージョンである2012-10-17を使用します。

Statement

作成する IAM ポリシーについての条件をこちらに記載していきます。
1つのポリシー内に複数のステートメントがあり、1つのリクエストに対して複数のステートメントが当てはまる場合は OR 判定されます。
ステートメントの中身は以下の通りです、

Sid

任意でステートメントの ID を命名することが可能です。
なるべくわかりやすい命名を心がけます。

Effect

Allowを設定すると許可、Denyを設定すると拒否になります。
優先順位は以下の通りです。

  1. 明示的な拒否... Effect に記載したDenyが最優先される
  2. 明示的な許可... Effect に記載したAllowが明示的な拒否の次に優先される
  3. 暗黙的な拒否... Allowの対象にない Action は全て拒否(暗黙的な拒否)となる

Principal

AWS アカウントやサービスからリソースへのアクセスを許可 / 拒否することが可能です。
例えば、以下の図のように AWS アカウントA(アカウントID:012345678901) にある IAM ユーザー:yoshinana-testから AWS アカウントB(アカウントID:123456789012) にある EC2 インスタンスにアクセスしたいとします。

図:

あああああ

その場合、AWS アカウントB の IAM ロールを作成し、JSON 内のPrincipalに AWS アカウントA の アカウントID と IAM ユーザー名を指定し、EC2 の操作を許可することによって EC2 へのアクセスが可能になります。

例:

"Sid": "",
"Effect": "Allow",
"Principal": {
  "AWS": "arn:aws:iam::012345678901:user/yoshinana-test"
},

Action

AWS 上で実行する操作を指定します。
例えば、Amazon S3 へファイルのアップロードを許可する場合、s3.putObjectを指定します。

全てのActionリストは以下となります。

Actions, resources, and condition keys for AWS services - Service Authorization Reference

Resource

ポリシーが適用されるオブジェクトをResource内で定義します。
Amazon リソースネーム (ARN) を使用してリソースを指定します。ARN の形式は、AWS のサービスおよび参照先の特定のリソースによってそれぞれ違いがあります。

例えば、Amazon S3 バケットtest-s3-bucket内のすべてを指定したい場合、以下のように記述します。
アスタリスク(*)を入れることにより、test-s3-bucket内の全てと置き換えることが可能です。

"Resource": "arn:aws:s3:::test-s3-bucket/*",

Condition

ポリシーを実行するタイミングの条件を指定することができます。
Bool条件演算子を使用して特定の IAM ユーザー以外はDenyする、IpAddress条件演算子を使用して特定の IP アドレスはAllowし、それ以外はDenyするといった条件の制御が可能です。

Conditionの記法として、1つ目のネストに条件演算子、2つ目のネストに条件の値を指定します。

例えば、IpAddress条件演算子を使用して特定の IP アドレス0.0.0.0/0Allowする場合、以下のように記述します。

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "0.0.0.0/0"
  }
}

また、DenyNotIpAdressを使用して特定の IP アドレス以外は全て拒否するといったことも可能です。
以下ですと、10.0.10.0以外のアクセスを全て拒否、という表現になります。

"Effect": "Deny",
"Condition": {
  "NotIpAddress": {
    "aws:SourceIp": "10.0.10.0/0"
  }
}

参考ドキュメント:

IAM JSON ポリシー要素NotAction - AWS Identity and Access Management

その他の条件演算子は以下となります。

IAM JSON ポリシー要素: 条件演算子 - AWS Identity and Access Management

まとめ

以上で、「IAM ポリシーの記法について理解する」は以上となります。
今までConditionなどはふわっとしか理解していなかったのですが、より深く理解することができました!
ここまで読んでいただき、ありがとうございました。

参考文献

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.